import sys
import os
# 添加项目根目录到系统路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

import openpyxl
import re  # 添加正则表达式模块
import asyncio
from typing import List, Tuple

def get_dict_file_path(file_name: str) -> str:
    """
    获取字典文件的完整路径
    :param file_name: 字典文件名
    :return: 完整的文件路径
    """
    base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    # 如果文件名已经包含file目录，则直接拼接
    if file_name.startswith("file/"):
        return os.path.join(base_dir, file_name)
    # 否则添加file目录
    return os.path.join(base_dir, "file", file_name)

def classify_problem(file_name, query_str, sheet_name=None):
    """
    从 Excel 文件中读取问题分类映射，根据查询字符串返回对应字典值
    :param file_name: 要读取的 Excel 文件名（含路径，如 "问题分类.xlsx"）
    :param query_str: 要查询的字符串（以 ";" 分割多个问题项）
    :param sheet_name: 要读取的工作表名，默认为 None（读取第一个工作表）
    :return: 匹配到的字典值，以英文逗号拼接；无匹配则返回原始查询字符串
    """
    # 1. 初始化字典：key=Excel第二列（字典内容），value=Excel第一列（字典值）
    problem_dict = {}
    
    # 2. 读取 Excel 文件并构建字典
    try:
        file_path = get_dict_file_path(file_name)
        workbook = openpyxl.load_workbook(file_path)  # 加载 Excel 文件
        if sheet_name:
            sheet = workbook[sheet_name]  # 如果指定了工作表名，则读取指定工作表
        else:
            sheet = workbook.active  # 否则默认取第一个工作表
    except FileNotFoundError:
        print(f"错误：文件 {file_path} 不存在！")
        return query_str
    except KeyError:
        print(f"错误：工作表 {sheet_name} 不存在！")
        return query_str
    
    for row in sheet.iter_rows(values_only=True):  # values_only 直接获取单元格内容（不含格式）
        if len(row) >= 2:  # 确保行至少有两列数据
            dict_value = str(row[0]).strip()   # 第一列：字典值（如 "010123"）
            dict_content = str(row[1]).strip() # 第二列：字典内容（如 "在重大原则问题上不同党中央保持一致"）
            problem_dict[dict_content] = dict_value  # 建立映射关系

    # 3. 处理查询字符串（空值/清洗/分割/匹配）
    if not query_str or query_str.strip() == "":  # 输入为空时直接返回空
        return ""
    
    # 使用正则表达式去除!符号
    query_str = re.sub(r'!', '', query_str)
    
    # 检查是否包含分隔符
    if ";" in query_str:
        # 按 "；" 分割成多个待匹配项
        items = query_str.split(";")
    else:
        # 如果没有分隔符，则作为单个项处理
        items = [query_str]
        
    result = []
    for item in items:
        cleaned_item = item.strip()  # 去除项前后空格（避免输入多余空格导致匹配失败）
        if cleaned_item in problem_dict:  # 匹配到字典内容
            result.append(problem_dict[cleaned_item])  # 加入对应的字典值

    # 4. 拼接结果并返回
    if result:
        return ",".join(result)
    else:
        return query_str  # 如果没有找到匹配的字典值，返回原始查询字符串

def get_dict_name(file_name, dict_value, sheet_name=None):
    """
    从 Excel 文件中读取字典映射，根据字典值返回对应的字典名称
    :param file_name: 要读取的 Excel 文件名（含路径）
    :param dict_value: 要查询的字典值
    :param sheet_name: 要读取的工作表名，默认为 None（读取第一个工作表）
    :return: 匹配到的字典名称；无匹配则返回原值
    """
    try:
        file_path = get_dict_file_path(file_name)
        workbook = openpyxl.load_workbook(file_path)
        if sheet_name:
            sheet = workbook[sheet_name]
        else:
            sheet = workbook.active

        # 构建反向映射字典：key=字典值，value=字典名称
        reverse_dict = {}
        for row in sheet.iter_rows(values_only=True):
            if len(row) >= 2:
                value = str(row[0]).strip()
                name = str(row[1]).strip()
                reverse_dict[value] = name

        # 如果输入是逗号分隔的多个值，分别处理
        if "," in dict_value:
            values = dict_value.split(",")
            names = []
            for value in values:
                value = value.strip()
                if value in reverse_dict:
                    names.append(reverse_dict[value])
                else:
                    names.append(value)
            return "；".join(names)
        else:
            # 单个值的情况
            if dict_value in reverse_dict:
                return reverse_dict[dict_value]
            return dict_value

    except Exception as e:
        print(f"查询字典名称时发生错误: {str(e)}")
        return dict_value

def load_excel_dict(file_name: str, sheet_name: str) -> dict:
    """
    预加载Excel字典数据到内存中
    :param file_name: Excel文件名
    :param sheet_name: 工作表名
    :return: 字典数据，key为字典内容，value为字典值
    """
    try:
        file_path = get_dict_file_path(file_name)
        workbook = openpyxl.load_workbook(file_path)
        sheet = workbook[sheet_name]
        
        # 构建字典
        dict_data = {}
        for row in sheet.iter_rows(values_only=True):
            if len(row) >= 2:
                dict_value = str(row[0]).strip()
                dict_content = str(row[1]).strip()
                dict_data[dict_content] = dict_value
                
        return dict_data
    except Exception as e:
        print(f"加载Excel字典数据时发生错误: {str(e)}")
        return {}

# ========== 测试代码（示例） ==========
if __name__ == "__main__":
    # 测试字典值到字典名称的转换
    excel_file = "训练模型字典.xlsx"
    dict_value = "01031804,010607"
    result = get_dict_name(excel_file, dict_value, "最后一级问题性质")
    print(f"字典值 {dict_value} 对应的字典名称: {result}")

